import java.io.FileReader;
import java.util.Vector;

import au.com.bytecode.opencsv.CSVReader;


/*
 * Управление выдачей проксей, загрузка из их файла
 * 
 * Формат файла прокси:aaa.ddd.rrr.sss:port
 */
public class ProxyManager {
	
	//Список проксей 
	private Vector<Proxy> proxies;
	
	public ProxyManager(String proxyFileName) {
		proxies = new Vector<Proxy>();
		//вытаскиваем из файла прокси
		try {
			//открываем файл, сепаратор адреса и порта - :
			CSVReader reader = new CSVReader(new FileReader(proxyFileName), ':');
			
			String lineValues[] = null;
			
			//считываем построчно
			while ((lineValues = reader.readNext()) != null) {
				if (lineValues.length >= 2) { 
					proxies.add(new Proxy(lineValues[0], Integer.parseInt(lineValues[1])));
				}
			}
			
			//закрываем
			reader.close();
		} 
		catch (Exception e) {
			//FileNotFound exception, NumberFormatException
			System.out.println("ProxyManager.ProxyManager() exception caught: " + e);
		}
		
		System.out.println("ProxyManager.ProxyManager() proxies size:" + proxies.size());
	}
	
	/*
	 * Отдача 1 прокси с удалением, если больше нет - null
	 * синхронизация для потоковой безопасности
	 */
	public synchronized Proxy getNextProxy() {
		Proxy pr = null;
		
		//берем прокси из начала
		if (proxies.size() > 0) {
			pr = proxies.remove(0);
			//прокси кончились - сообщим об этом в консоль
			if (proxies.size() == 0) {
				System.out.println("ProxyManager.getNextProxy() no more proxies, return last!");
			}
		}
		
		return pr;
	}
	
	/*
	 * Добавление живой прокси в общий список(если после окончания работы потока она ещё жива)
	 * синхронизация для потоковой безопасности
	 */
	public synchronized void returnProxyToList(Proxy proxy) {
		if (!proxies.contains(proxy)) {
			//вставляем в начало, чтобы доработать до rateLimit(сюда попадут только живые)
			proxies.insertElementAt(proxy, 0);
		}
	}
	
	public int proxiesSize() {
		return proxies.size();
	}

}
